﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Resources;
using Cesave.Domain.Core;
using System.Data;

namespace Cesave.Domain.PermisosModule.Contracts.ProduccionTipos
{
	/// <summary>
	/// Implementación del servicio de tipos de producción.
	/// </summary>
	public class ProduccionTipoService
		: IProduccionTipoService
	{
		#region Private properties

		/// <summary>
		/// Repositorio de tipos de producción.
		/// </summary>
		private IProduccionTipoRepository _produccionTipoRepository;

		#endregion

		#region Constructor

		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="produccionTipoRepository">
		/// Repositorio de tipo de producción.
		/// </param>
		public ProduccionTipoService(IProduccionTipoRepository produccionTipoRepository)
		{
			if (produccionTipoRepository == null)
				throw new ArgumentNullException(Messages.exception_DependenciesAreNotInitialized, "produccionTipoRepository");
			_produccionTipoRepository = produccionTipoRepository;
		}

		#endregion

		#region IProduccionTipoService Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="tipo"></param>
		public void AddProduccionTipo(Entities.ProduccionTipo tipo)
		{
			if (tipo == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "tipo");
			IUnitOfWork unitOfWork = _produccionTipoRepository.StoreContext;
			_produccionTipoRepository.Add(tipo);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="tipo"></param>
		public void ChangeProduccionTipo(Entities.ProduccionTipo tipo)
		{
			if (tipo == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "tipo");
			IUnitOfWork unitOfWork = _produccionTipoRepository.StoreContext;
			_produccionTipoRepository.Modify(tipo);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		public List<Entities.ProduccionTipo> FindAllProduccionTipos()
		{
			return _produccionTipoRepository.GetAll().OrderBy(t => t.Orden).ToList();
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="status"></param>
		/// <returns></returns>
		public List<Entities.ProduccionTipo> FindProduccionTiposByStatus(bool status = true)
		{
			return _produccionTipoRepository.FindProduccionTiposByStatus(new ProduccionTiposByStatusSpecification(status)).ToList();
		}

		#endregion

		#region IDisposable Members

		public void Dispose()
		{
			if (_produccionTipoRepository != null && _produccionTipoRepository.StoreContext != null)
				_produccionTipoRepository.StoreContext.Dispose();
		}

		#endregion
	}
}
